﻿#ifndef DATAIMPORTCONFIGURATIONDATA_H
#define DATAIMPORTCONFIGURATIONDATA_H

#include <QString>
#include <QObject>
#include <QSharedPointer>
#include <QList>
#include "DialogDataImportConfiguration.h"
#include "DataManager/DataImportConfigurationDataManager.h"

#define  DataImportConfigurationDataInstance pst::DataImportConfigurationData::getinstance()
namespace pst
{
    class DataImportConfigurationData
    {
    public:
        static DataImportConfigurationData* getinstance();

        void initDataImportConfigurationData();

        /// @brief 获取变量类别数据
        /// @return 获取变量类别，只有类别，无单位
        QList<QString> getVariableCategoryData();
        /// @brief 获取变量类别全部数据
        /// @return 变量类别+对应单位List
        QList<QPair<QString, QList<QString>>> getVariableCategoryTotalData();

        /// @brief 获取因变量数据
        /// @return 获取因变量数据，只有因变量列
        QList<QString> getDependentVariableData();
        /// @brief 获取因变量类别数据
        /// @return 获取因变量类别数据，只有因变量（标量）的类别列数据
        QList<QString> getDependentVariableCategoryData1();
        /// @brief 获取因变量类别数据
        /// @return 获取因变量类别数据，只有因变量（实部+虚部）的类别列数据
        QList<QString> getDependentVariableCategoryData2();

        /// @brief 获取因变量类别对应单位数据
        /// @return 因变量对应单位数据
        QList<QPair<QString, QList<QString>>> getDependentVariableCategoryUnitData();

        void addImportItemID(int itemID);
        void addTextImportData(QString filePath, const QVector<std::tuple<QString, DialogDataImportConfiguration::DataProperty, QVector<double>>>& datas, QVector<QPair<QPointF, int>> resultFileData, FileDataTypes fileDataType);

        void removeTextImportDataByItemID(int ItemID);
        //执行text导入
        bool executeTextReadAndImport(QString filePath);

        QString TextAndCsvCustomDataConversionToQString(QString filePath, const QVector<std::tuple<QString, DialogDataImportConfiguration::DataProperty, QVector<double>>>& datas, QVector<QPair<QPointF, int>> resultFileData, FileDataTypes fileDataType);

        bool TextAndCsvCustomDataConversionFromQStringAndExecute(QString customData);
        /// @brief 读取配置数据
        void readConfig();

        /// @brief 保存配置数据
        void writeConfig();

        /// @brief 重置数据，新建项目时需要清空原来数据
        void resetData();

    private:
        DataImportConfigurationData() = default;
        ~DataImportConfigurationData();

        void initeVariableCategoryTotalData();
        void initDependentVariableTotalData();

        // 辅助函数：DataProperty转JSON
        static QJsonObject dataPropertyToJson(const DialogDataImportConfiguration::DataProperty& prop);
        // 辅助函数：JSON转DataProperty
        static DialogDataImportConfiguration::DataProperty jsonToDataProperty(const QJsonObject& obj);
        // 转换为字符串
        static QString toString(const QVector<std::tuple<QString, DialogDataImportConfiguration::DataProperty, QVector<double>>>& data);
        // 从字符串转换回来
        static QVector<std::tuple<QString, DialogDataImportConfiguration::DataProperty, QVector<double>>> fromString(const QString& str);

    private:
        static DataImportConfigurationData* _instance;
        QList<QString> m_VariableCategoryData{};//变量类别数据：类别
        QList<QPair<QString,QList<QString>>> m_VariableCategoryTotalData{};//变量类别所有数据：类别+单位List（一个类别对应多个单位）

        QList<QString> m_DependentVariableData{};//因变量数据：因变量数据
        QList<QString> m_DependentVariableCategoryData1{};//因变量类别数据：因变量（标量）类别数据
        QList<QString> m_DependentVariableCategoryData2{};//因变量类别数据：因变量（实部+虚部）/（幅度+相位）类别数据
        QList<QPair<QString, QList<QString>>> m_DependentVariableCategoryUnitData{}; //因变量类别数据：因变量类别对应的单位数据

        QList<int> m_importItemID,m_tempImportItemID;
        QList<QString> m_filePaths, m_tempFilePaths;
        QList<QVector<std::tuple<QString, DialogDataImportConfiguration::DataProperty, QVector<double>>>> m_datas, m_tempDatas;
        QList<QVector<QPair<QPointF, int>>> m_resultFileDatas, m_tempResultFileDatas;
        QList<FileDataTypes> m_fileDataTypes, m_tempFileDataTypes;

        /// @brief 配置文件中数据
        QSharedPointer<DataManager::DataImportConfigurationDataManager> m_configData;
    };
}


#endif
